<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>systemd-journald.service
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>systemd-journald.service 中文手册</h1><h2 id="auth_name">译者：<strong><a href="http://www.jinbuguo.com/">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="http://www.jinbuguo.com/">金步国作品集</a> [ <a href="http://www.jinbuguo.com/">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="systemd-journald.service"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>systemd-journald.service, systemd-journald.socket, systemd-journald-dev-log.socket, systemd-journald-audit.socket, systemd-journald — 日志服务</p></div><div class="refsynopsisdiv"><h2>大纲</h2><p><code class="filename">systemd-journald.service</code></p><p><code class="filename">systemd-journald.socket</code></p><p><code class="filename">systemd-journald-dev-log.socket</code></p><p><code class="filename">systemd-journald-audit.socket</code></p><p><code class="filename">/usr/lib/systemd/systemd-journald</code></p></div><div class="refsect1"><a name="id-1.5"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p><code class="filename">systemd-journald</code>
    是一个收集并存储各类日志数据的系统服务。
    它创建并维护一个带有索引的、结构化的日志数据库，
    并可以收集来自各种不同渠道的日志：</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p>通过 kmsg 收集内核日志</p></li><li class="listitem"><p>通过 <code class="filename">libc</code> 的
      <a href="http://man7.org/linux/man-pages/man3/syslog.3.html"><span class="citerefentry"><span class="refentrytitle">syslog</span>(3)</span></a>
      接口收集系统日志</p></li><li class="listitem"><p>通过
      本地日志接口
      <a href="http://www.jinbuguo.com/systemd/sd_journal_print.html#"><span class="citerefentry"><span class="refentrytitle">sd_journal_print</span>(3)</span></a> 收集结构化的系统日志</p></li><li class="listitem"><p>捕获服务单元的标准输出(STDOUT)与标准错误(STDERR)。
      详见下文。</p></li><li class="listitem"><p>通过内核审计子系统收集审计记录</p></li></ul></div><p>日志守护进程会以安全且不可伪造的方式自动收集每条日志的元数据。
    参见
    <a href="systemd.journal-fields.html#"><span class="citerefentry"><span class="refentrytitle">systemd.journal-fields</span>(7)</span></a>
    以了解究竟收集了哪些元数据。
    </p><p>收集到的大部分日志数据都是文本数据，但同样也可以收集二进制数据。
    组成日志记录的各个字段大小上限为16ZB(16*1024*1024TB)。</p><p>日志服务要么将日志持久存储在 <code class="filename">/var/log/journal</code> 目录中、
    要么将日志临时存储在 <code class="filename">/run/log/journal/</code> 目录中(关机即丢失)。默认情况下，
    如果在启动期间存在 <code class="filename">/var/log/journal/</code> 目录，那么日志将会被持久存储在此目录中，
    否则将会临时存储在 <code class="filename">/run/log/journal/</code> 目录中。可以使用 <code class="varname">Storage=</code> 选项(参见
    <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a> 手册)
    设置日志的存储位置(无论 <code class="filename">/var/log/journal/</code> 目录是否存在)。</p><p>如果 <code class="filename">/var/log/journal/</code> 目录不存在，
    同时又将日志配置为持久存储(这是 <code class="filename">journald.conf</code> 的默认配置)，那么将会尽可能自动创建该目录，
    并为其设置正确的权限与拥有者：</p><pre class="programlisting">mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal</pre><p>详见
    <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a>
    以了解如何配置此日志服务。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="日志流">日志流<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E6%97%A5%E5%BF%97%E6%B5%81">¶</a></h2><p>所有服务进程的标准输出(STDOUT)与标准错误(STDERR)默认都会被连接到日志服务。
    但这个默认行为可以通过
    <code class="varname">StandardOutput=</code>/<code class="varname">StandardError=</code> 进行修改(详见
    <a href="systemd.exec.html#"><span class="citerefentry"><span class="refentrytitle">systemd.exec</span>(5)</span></a> 手册)。
    日志服务会将通过此方式接收到的日志字节流，按照换行符("<code class="literal">\n</code>", ASCII <code class="constant">10</code>)
    与 <code class="constant">NUL</code> 字节("<code class="literal">\0</code>", ASCII <code class="constant">0</code>)进行切分，最终转化为一条条日志记录。</p><p>如果 <code class="filename">systemd-journald.service</code> 被停止，那么连接到服务进程的所有日志流都将被终止，
    继续写入日志流将会导致 <code class="constant">EPIPE</code> 错误。为了从容应对这种情况，
    强烈建议将日志输出到标准输出(STDOUT)或标准错误(STDERR)的服务进程忽略 <code class="constant">EPIPE</code> 错误。
    如果没有阻止或关闭 <code class="constant">SIGPIPE</code> 信号处理器，
    这种写入还会导致产生 <code class="constant">SIGPIPE</code> 进程信号(详见
    <a href="http://www.jinbuguo.com/systemd/signal.html#"><span class="citerefentry"><span class="refentrytitle">signal</span>(7)</span></a> 手册)。
    为了避免上述问题，systemd 默认关闭所有被调用进程的 <code class="constant">SIGPIPE</code> 信号(但是可以通过
     <code class="varname">IgnoreSIGPIPE=</code> 选项专门为某些个别单元打开，详见
    <a href="systemd.exec.html#"><span class="citerefentry"><span class="refentrytitle">systemd.exec</span>(5)</span></a> 手册)。
    要想恢复被终止的标准输出(STDOUT)与标准错误(STDERR)日志流，只能再次启动日志服务。
    在常规情况下，
    <code class="filename">systemd-journald.service</code> 会将日志流的文件描述符副本存储在 systemd 服务管理器中。
    如果 <code class="filename">systemd-journald.service</code> 被 <span class="command"><strong>systemctl
    restart</strong></span> 命令或等价操作重启(而不是一对分隔的 <span class="command"><strong>systemctl stop</strong></span> 与
    <span class="command"><strong>systemctl start</strong></span> 命令或等价操作)，那么日志流连接不会在重启过程中发生中断。
    因此，重启 <code class="filename">systemd-journald.service</code>
    是安全的(但是千万不要停止它)。</p><p>从上述标准输出(STDOUT)/标准错误(STDERR)日志流中提取的日志记录的元数据由最初创建日志流的端点决定。
    如果将日志流连接传递给另外一个进程(例如从主服务进程派生出来的子进程)，
    那么日志记录的元数据将不会反映出后继的日志实际上是来自于另一个进程(仍然认为是来自于最初的进程)。
    这不同于前文列举的其他日志收集渠道。
    对于其他日志收集渠道而言，元数据天生就是基于一条条独立的日志记录生成的，
    所以天然的不存在这个问题。</p><p>除了服务单元的标准输出(STDOUT)/标准错误(STDERR)隐含的使用了日志流来记录，还可以通过
     <a href="systemd-cat.html#"><span class="citerefentry"><span class="refentrytitle">systemd-cat</span>(1)</span></a>
    命令行工具来使用日志流。</p><p>目前， <code class="filename">systemd-journald</code> 最多同时接受 4096 个日志流。
    到达此限制之后，后继的日志流虽然可以成功建立连接，但是会在一开始写入就得到
    <code class="constant">EPIPE</code> 错误。</p></div><div class="refsect1"><a name="id-1.7"></a><h2 id="信号">信号<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E4%BF%A1%E5%8F%B7">¶</a></h2><div class="variablelist"><dl class="variablelist"><dt id="SIGUSR1"><span class="term">SIGUSR1</span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#SIGUSR1">¶</a></dt><dd><p>要求将
        <code class="filename">/run/</code> 中的日志数据刷写到
        <code class="filename">/var/</code> 中(若存在且可写入)，
        并等待其完成，以确保被永久保存。这通常是挂载
        <code class="filename">/var/</code> 之后的必要动作，
        否则 <code class="filename">/run</code> 中的日志数据永远也不会被刷写到
        <code class="filename">/var</code> 中(无论配置文件怎样设置)。
        <span class="command"><strong>journalctl --flush</strong></span>
        命令就是使用这个信号的典型例子。
        详见
        <a href="journalctl.html#"><span class="citerefentry"><span class="refentrytitle">journalctl</span>(1)</span></a>
        手册。</p></dd><dt id="SIGUSR2"><span class="term">SIGUSR2</span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#SIGUSR2">¶</a></dt><dd><p>要求立即滚动日志，并等待其完成。
        <span class="command"><strong>journalctl --rotate</strong></span>
        命令就是
        使用这个信号的典型例子。</p></dd><dt id="SIGRTMIN+1"><span class="term">SIGRTMIN+1</span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#SIGRTMIN+1">¶</a></dt><dd><p>要求将所有缓存中的日志刷写到磁盘上，并等待其完成。
        <span class="command"><strong>journalctl --sync</strong></span>
        命令就是
        使用这个信号的典型例子。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.8"></a><h2 id="内核引导选项">内核引导选项<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E5%86%85%E6%A0%B8%E5%BC%95%E5%AF%BC%E9%80%89%E9%A1%B9">¶</a></h2><p>一些
    <code class="filename">journald.conf</code> 中的配置参数可以被内核引导选项覆盖，
    具体说来就是：</p><div class="variablelist"><dl class="variablelist"><dt id="systemd.journald.forward_to_syslog="><span class="term"><code class="varname">systemd.journald.forward_to_syslog=</code>, </span><span class="term"><code class="varname">systemd.journald.forward_to_kmsg=</code>, </span><span class="term"><code class="varname">systemd.journald.forward_to_console=</code>, </span><span class="term"><code class="varname">systemd.journald.forward_to_wall=</code></span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#systemd.journald.forward_to_syslog=">¶</a></dt><dd><p>允许/禁止将收集到的日志：
        转发到传统的 <a class="ulink" href="http://www.jinbuguo.com/linux/sysklogd.html" target="_top">syslog</a> 守护进程, 转发到内核日志缓冲区, 转发到系统控制台,
        作为wall警告信息转发给所有已登录的用户
        </p><p>详见
        <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a>
        手册。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.9"></a><h2 id="访问控制">访问控制<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6">¶</a></h2><p>日志文件默认属于root用户及
    "<code class="literal">systemd-journal</code>" 组，权限为"640"，
    也就是仅对root用户可读写、仅对 "<code class="literal">systemd-journal</code>" 组可读。
    若想允许某个用户读取日志，可将其加入到 "<code class="literal">systemd-journal</code>" 组中。</p><p>默认情况下，每个已登录用户都在
    <code class="filename">/var/log/journal/</code> 中拥有自己专属的日志文件，
    但是这些专属日志文件的属主依然是root用户。
    这样做的目的在于：在禁止用户修改日志的同时，
    又可以通过文件系统的访问控制列表(ACL)赋予用户对日志的只读权限。</p><p>还可以通过文件系统的访问控制列表(ACL)
    将日志的访问权限赋予特定的用户、组。
    例如，下面的命令就赋予了
    "<code class="literal">wheel</code>" 与 "<code class="literal">adm</code>"
    组的所有用户读取日志的权限：</p><pre class="programlisting"># setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/</pre><p>注意，此命令不但更新了
    <code class="filename">/var/log/journal/</code> 目录中已有日志文件的访问控制列表(ACL)，
    而且对未来创建的日志文件也有效。</p></div><div class="refsect1"><a name="id-1.10"></a><h2 id="文件">文件<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E6%96%87%E4%BB%B6">¶</a></h2><div class="variablelist"><dl class="variablelist"><dt id="/etc/systemd/journald.conf"><span class="term"><code class="filename">/etc/systemd/journald.conf</code></span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#/etc/systemd/journald.conf">¶</a></dt><dd><p>配置 <span class="command"><strong>systemd-journald</strong></span> 的行为，详见
        <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a> 手册。
        </p></dd><dt id="/run/log/journal/machine-id/*.journal"><span class="term"><code class="filename">/run/log/journal/<em class="replaceable"><code>machine-id</code></em>/*.journal</code>, </span><span class="term"><code class="filename">/run/log/journal/<em class="replaceable"><code>machine-id</code></em>/*.journal~</code>, </span><span class="term"><code class="filename">/var/log/journal/<em class="replaceable"><code>machine-id</code></em>/*.journal</code>, </span><span class="term"><code class="filename">/var/log/journal/<em class="replaceable"><code>machine-id</code></em>/*.journal~</code></span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#/run/log/journal/machine-id/*.journal">¶</a></dt><dd><p><span class="command"><strong>systemd-journald</strong></span> 将日志文件存放在
        <code class="filename">/run/log/journal/<em class="replaceable"><code>machine-id</code></em>/</code>
        或
        <code class="filename">/var/log/journal/<em class="replaceable"><code>machine-id</code></em>/</code>
        目录中，并用 "<code class="literal">.journal</code>" 作为日志文件的后缀名。
        如果守护进程未能干净的退出或者日志文件未能通过正确性检查，
        那么当前日志文件的后缀名将会被重命名为 "<code class="literal">.journal~</code>" ，
        同时 <span class="command"><strong>systemd-journald</strong></span> 将会从一个全新的日志文件开始记录。
        仅在下列两种情况下，才会使用 <code class="filename">/run</code> 目录记录日志文件：
        (1)当 <code class="filename">/var/log/journal</code> 目录不可用时；
        (2)明确设置了 <code class="option">Storage=volatile</code> 时(位于
        <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a>
        配置文件中)。</p><p>当 <code class="filename">systemd-journald</code> 结束一个日志文件的写入时，
        该日志文件将被重命名为 "<code class="literal"><em class="replaceable"><code>original-name</code></em>@<em class="replaceable"><code>suffix.journal</code></em></code>"
        或 "<code class="literal"><em class="replaceable"><code>original-name</code></em>@<em class="replaceable"><code>suffix.journal~</code></em></code>" ，
        以完成日志文件的"归档"。</p><p>一般来说，可以安全的读取与拷贝任意日志文件(无论是否已经归档)。
        <a href="journalctl.html#"><span class="citerefentry"><span class="refentrytitle">journalctl</span>(1)</span></a>
        工具与
        <a href="http://www.jinbuguo.com/systemd/sd-journal.html#"><span class="citerefentry"><span class="refentrytitle">sd-journal</span>(3)</span></a>
        库应该能够读取所有已经写入到文件系统的日志项。</p><p><code class="filename">systemd-journald</code> 会自动删除最早的日志归档以限制磁盘空间的用量。
         详见 <code class="varname">SystemMaxUse=</code>
        选项以及其他
        <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a> 中的相关选项。
        </p></dd><dt id="/dev/kmsg"><span class="term"><code class="filename">/dev/kmsg</code>, </span><span class="term"><code class="filename">/dev/log</code>, </span><span class="term"><code class="filename">/run/systemd/journal/dev-log</code>, </span><span class="term"><code class="filename">/run/systemd/journal/socket</code>, </span><span class="term"><code class="filename">/run/systemd/journal/stdout</code></span><a class="headerlink" title="Permalink to this term" href="systemd-journald.service.html#/dev/kmsg">¶</a></dt><dd><p>
        <span class="command"><strong>systemd-journald</strong></span> 除了监听上述文件，
        还通过 netlink 监听
        审计系统事件。</p></dd></dl></div></div><div class="refsect1"><a name="id-1.11"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="systemd-journald.service.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>,
      <a href="journalctl.html#"><span class="citerefentry"><span class="refentrytitle">journalctl</span>(1)</span></a>,
      <a href="journald.conf.html#"><span class="citerefentry"><span class="refentrytitle">journald.conf</span>(5)</span></a>,
      <a href="systemd.journal-fields.html#"><span class="citerefentry"><span class="refentrytitle">systemd.journal-fields</span>(7)</span></a>,
      <a href="http://www.jinbuguo.com/systemd/sd-journal.html#"><span class="citerefentry"><span class="refentrytitle">sd-journal</span>(3)</span></a>,
      <a href="systemd-coredump.html#"><span class="citerefentry"><span class="refentrytitle">systemd-coredump</span>(8)</span></a>,
      <a href="https://linux.die.net/man/1/setfacl"><span class="citerefentry"><span class="refentrytitle">setfacl</span>(1)</span></a>,
      <a href="http://www.jinbuguo.com/systemd/sd_journal_print.html#"><span class="citerefentry"><span class="refentrytitle">sd_journal_print</span>(3)</span></a>,
      <span class="command"><strong>pydoc systemd.journal</strong></span>
    </p></div></div></body></html>
